/**
 * 类名：AuthorizationInterceptor
 * 创建日期： 2014-10-7 下午3:22:26
 *
 */
package com.erms.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;

import com.erms.Config;
import com.erms.util.LogUtil;
import com.erms.util.StringUtil;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

/**
 * 备注： 登录权限拦截器，用于拦截对要求登录权限的操作的非法请求，
 * 比如在在未登录或登录过期的情况下请求获取学生信息。
 * 拦截器会跳转至登录页并传递当前请求的路径信息，以便成功登陆后重新发起这个请求
 * 
 * @author hmb
 * 
 */
@SuppressWarnings("serial")
public class AuthorizationInterceptor extends AbstractInterceptor {

	private String	forwardUrl;								// 当前请求路径，绝对路径，但不含域名端口信息
	private String	userName;									// session中记录的用户名

	private Logger	logger	= LogUtil.getLogger(getClass());

	/**
	 * @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
	 * @param arg0
	 * @return
	 * @throws Exception
	 */
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {

		logger.debug("权限拦截器工作");
		HttpServletRequest request = ServletActionContext.getRequest();
		// 获取session对象
		HttpSession session = request.getSession();

		forwardUrl = request.getRequestURI();
		userName = (String) session.getAttribute("username");
		logger.debug("当前请求路径：" + forwardUrl);

		if (!StringUtil.isNull(userName)) {
			logger.debug("用户已登录，用户名：" + userName);
			// 这里是否应该请求数据库验证用户名的合法性？
			return invocation.invoke();
		} else if (Config.DEBUG && Config.enableTestUser) {
			logger.debug("未登录，允许测试用户直接登录");
			// 将用来判断将要登录的测试用户类型，检测路径中是否包含"student" 或 "teacher"目录
			String s = forwardUrl.substring(0, forwardUrl.lastIndexOf("/"));
			logger.debug("剔除请求方法后的url:" + s);

			if (s.contains("student")) {
				session.setAttribute(Config.USER_NAME, Config.STUDENT_ID);
			} else if (s.contains("teacher")) {
				session.setAttribute(Config.USER_NAME, Config.TEACHER_ID);
			} else if (s.contains("admin")) {
				session.setAttribute(Config.USER_NAME, Config.ADMIN_ID);
			} else {
				logger.debug("未能正确检测到用户类型");
				forwardUrl = StringUtil.urlEncode(forwardUrl);
				return ActionSupport.LOGIN;
			}
			return ActionSupport.SUCCESS;
		}
		logger.debug("未登录，需要跳转至登录页");
		forwardUrl = StringUtil.urlEncode(forwardUrl);
		return ActionSupport.LOGIN;

	}

	public String getForwardUrl() {

		return forwardUrl;
	}

	public void setForwardUrl(String forwardUrl) {

		this.forwardUrl = forwardUrl;
	}

}
